package com.other;

import java.util.ArrayList;
import java.util.ListIterator;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class OrderedABCPrinter {
    // 创建可重入锁
    private final ReentrantLock lock = new ReentrantLock();
    // 为A、B、C分别创建条件变量（用于等待/唤醒）
    private final Condition conditionA = lock.newCondition();
    private final Condition conditionB = lock.newCondition();
    private final Condition conditionC = lock.newCondition();
    // 标记当前应打印的字符：0→A，1→B，2→C
    private int flag = 0;

    // 打印A的方法
    public void printA() throws InterruptedException {
        for (int i = 0; i < 100; i++) { // 循环100次
            lock.lock(); // 获取锁
            try {
                // 若当前不该打印A，则等待（防止虚假唤醒，用while判断）
                while (flag != 0) {
                    conditionA.await();
                }
                System.out.print("A"); // 打印A
                flag = 1; // 下一个该打印B
                conditionB.signal(); // 唤醒打印B的线程
            } finally {
                lock.unlock(); // 释放锁（必须放在finally中）
            }
        }
    }

    // 打印B的方法
    public void printB() throws InterruptedException {
        for (int i = 0; i < 100; i++) {
            lock.lock();
            try {
                while (flag != 1) {
                    conditionB.await();
                }
                System.out.print("B");
                flag = 2; // 下一个该打印C
                conditionC.signal(); // 唤醒打印C的线程
            } finally {
                lock.unlock();
            }
        }
    }

    // 打印C的方法
    public void printC() throws InterruptedException {
        for (int i = 0; i < 100; i++) {
            lock.lock();
            try {
                while (flag != 2) {
                    conditionC.await();
                }
                System.out.print("C");
                flag = 0; // 下一个该打印A
                conditionA.signal(); // 唤醒打印A的线程
            } finally {
                lock.unlock();
            }
        }
    }

    public static void main(String[] args) {
        OrderedABCPrinter printer = new OrderedABCPrinter();

//        // 启动打印A的线程
//        new Thread(() -> {
//            try {
//                printer.printA();
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }).start();
//
//        // 启动打印B的线程
//        new Thread(() -> {
//            try {
//                printer.printB();
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }).start();
//
//        // 启动打印C的线程
//        new Thread(() -> {
//            try {
//                printer.printC();
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }).start();
        ArrayList<Object> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        ListIterator<Object> iterator = list.listIterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            System.out.println(next);
            if (next.equals(3)) {
                iterator.add(6);
            }
        }
        System.out.println(list);
    }
}
